/**
 * @file interfacesock.h
 * @brief Definisce le strutture e le funzioni per gestire delle comunicazioni tramite socket.
 *
 * La struttura principale @see InterfaceSock definisce gli attributi per specificare
 * l'utilizzo di una fifo.
 *
 * @date Mar 10, 2012
 * @author Francesco Corvino
 */

#ifndef INTERFACESOCK_H_
#define INTERFACESOCK_H_

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>

/**
 * @brief Nome del file di registrazione delle sessioni
 */
#define SOCKSESSION_MAINPORT 56789

/**
 * @brief definizioni utilizzate per specificare il verso della fifo
 */
#define SOCKSESSION_CLIENT 0
#define SOCKSESSION_SERVER 1

#define MAX_LENGHT_DIR 255
#define MAX_SIZE_BUFFER BUFSIZ
#define NEWSESSION_STR "newsession"

//////////////////////////////////////////////////////////////////////////////////////////////
////// Strutture dati ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief Struttura principale su cui vengono memorizzate le principali informazioni sulla sessione fifo.
 */
typedef struct {
	int sd; /**< Socket descriptor della sessione */
	pid_t pid; /**< Indica il process id del server */
	unsigned int type; /**< Specifica il tipo di interfaccia creata */
	unsigned int port; /**< Porta su cui viene aperto il socket */
	struct sockaddr buffAddr; /**< allocazione di memoria per i server */
	socklen_t lenBuffAddr; /**< dimensione del buffer in memoria */
} InterfaceSock;

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per gestire la comunicazione con la FIFO /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void InterfaceSock_init(InterfaceSock * iSock,
		pid_t pid, unsigned int port ,unsigned int type);

void InterfaceSock_close(InterfaceSock * iSock);

int InterfaceSock_rcvMsg(InterfaceSock * iSock,char * buffer,int maxdim);

int InterfaceSock_sendMsg(InterfaceSock * iSock,char * buffer);

//////////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per lo startup delle comunicazioni ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////

void InterfaceSock_waitReg(InterfaceSock * listener, InterfaceSock* newComm);

void InterfaceSock_register(int port);

#endif /* INTERFACESOCK_H_ */
